package control;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

import javax.ejb.EJB;
import javax.enterprise.context.SessionScoped;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;

import service.ProjetoService;
import util.UsuarioLogado;
import entity.Projeto;
import entity.Projeto.SituacaoProjeto;

@Named
@SessionScoped
public class ManterProjetosControl implements Serializable {
	private static final long serialVersionUID = 8651477755019903138L;
	
	@EJB
	private ProjetoService service;
	
	@Inject
	private UsuarioLogado usuarioLogado;
	
	@Inject
	private MenuControl menuControl;
	
	private List<Projeto> projetos;
	
	private Long idProjetoSelecionado;
	private String nome;
	private Date inicio;
	private Date fim;
	private SituacaoProjeto situacao;
	private Boolean acessoRapido;
	
	// pesquisa
	private SituacaoProjeto[] todasSituacoes = SituacaoProjeto.values();
	private SituacaoProjeto[] situacoesSelecionadas = SituacaoProjeto.values();
	
	private Projeto projeto;
	
	private String motivoCancelamento;
	
	private boolean desabDatas = false;
	
	private String operacao;
	private static String OP_ALTERAR = "A";
	private static String OP_INCLUIR = "I";
	
	public String iniciar() {
		nome = null;
		
		return pesquisar();
	}
	
	public String pesquisar() {
		projetos = service.listarProjetosDoGerente(usuarioLogado.getRecursoLogado().getIdRecurso(), nome, situacoesSelecionadas);
		
		return "/pages/projeto/listar_projetos";
	}
	
	public String novo() {
		operacao = OP_INCLUIR;
		nome = null;
		inicio = null;
		fim = null;
		acessoRapido = true;
		situacao = null;
		motivoCancelamento = null;
		desabDatas = false;
		
		return "/pages/projeto/editar_projeto";
	}
	
	public String salvar() {
		String msg = null;
		if (OP_INCLUIR.equals(operacao)) {
			service.incluirProjeto(nome, inicio, fim,usuarioLogado.getRecursoLogado(), acessoRapido);
			
			msg = "Projeto " + nome + " incluído.";
			
			// após salvar atualizar a lista de projetos da combobox de menu
			menuControl.setProjetos(service.listarProjetosPorRecurso(usuarioLogado.getRecursoLogado().getIdRecurso()));
		} else if (OP_ALTERAR.equals(operacao)) {
			service.alterarProjeto(idProjetoSelecionado, nome, inicio, fim, acessoRapido);
			msg = "Projeto " + nome + " alterado.";
		}
		
		FacesContext.getCurrentInstance().addMessage(null, 
				new FacesMessage(FacesMessage.SEVERITY_INFO, msg, ""));
		
		return iniciar();
	}
	
	public String editar() {
		operacao = OP_ALTERAR;
		projeto = service.obterProjeto(idProjetoSelecionado);
		nome = projeto.getNome();
		inicio = projeto.getInicio();
		fim = projeto.getFim();
		acessoRapido = projeto.getAcessoRapido();
		situacao = projeto.getSituacao();
		motivoCancelamento = projeto.getMotivoCancelamento();
		
		desabDatas = !projeto.podeAlterarPeriodo();
		
		return "/pages/projeto/editar_projeto";
	}
	
	public String excluir() {
		service.excluirProjeto(idProjetoSelecionado);
		
		FacesContext.getCurrentInstance().addMessage(null, 
				new FacesMessage(FacesMessage.SEVERITY_INFO, "Projeto excluído.", ""));
		
		return iniciar();
	}
	
	public String confirmacaoCancelamento() {
		projeto = service.obterProjeto(idProjetoSelecionado);
		motivoCancelamento = null;
		return "";
	}
	
	public String cancelar() {
		service.cancelarProjeto(idProjetoSelecionado, motivoCancelamento);
		return iniciar();
	}
	
	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public Date getInicio() {
		return inicio;
	}

	public void setInicio(Date inicio) {
		this.inicio = inicio;
	}

	public Date getFim() {
		return fim;
	}

	public void setFim(Date fim) {
		this.fim = fim;
	}

	public List<Projeto> getProjetos() {
		return projetos;
	}

	public Long getIdProjetoSelecionado() {
		return idProjetoSelecionado;
	}

	public void setIdProjetoSelecionado(Long idProjetoSelecionado) {
		this.idProjetoSelecionado = idProjetoSelecionado;
	}
	
	public boolean getExibirAlterar() {
		return OP_ALTERAR.equals(operacao);
	}
	
	public boolean getExibirIncluir() {
		return OP_INCLUIR.equals(operacao);
	}

	public boolean isDesabDatas() {
		return desabDatas;
	}

	public String getMotivoCancelamento() {
		return motivoCancelamento;
	}

	public void setMotivoCancelamento(String motivoCancelamento) {
		this.motivoCancelamento = motivoCancelamento;
	}

	public Projeto getProjeto() {
		return projeto;
	}

	public SituacaoProjeto[] getTodasSituacoes() {
		return todasSituacoes;
	}

	public SituacaoProjeto[] getSituacoesSelecionadas() {
		return situacoesSelecionadas;
	}

	public void setSituacoesSelecionadas(SituacaoProjeto[] situacoesSelecionadas) {
		this.situacoesSelecionadas = situacoesSelecionadas;
	}
	
	public Boolean getAcessoRapido() {
		return acessoRapido;
	}

	public void setAcessoRapido(Boolean acessoRapido) {
		this.acessoRapido = acessoRapido;
	}

	public SituacaoProjeto getSituacao() {
		return situacao;
	}

	public void setSituacao(SituacaoProjeto situacao) {
		this.situacao = situacao;
	}
}
